#include <iostream>

using namespace std;

const int N = 10;

int n = 9;
int a[N][N];
bool row[N][N], col[N][N], st[N][N][N];//每一行、每一列、每一个3*3的数组均含 1−9 ，不重复

bool dfs(int i, int j)
{
	if(j == n) 
	{
		//当这一行填满之后
		i++;
		j = 0;
	}
	if(i == n) return true; // 找到一种合法的情况，就停止递归
	if(a[i][j]) return dfs(i, j+1);

	for(int x = 1; x <= 9; x++)
	{
		//不合法
		if(row[i][x] || col[j][x] || st[i / 3][j / 3][x]) continue; // 剪枝

		//合法，继续尝试递归填下一个格子
		a[i][j] = x;
		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = true;
		
		if(dfs(i, j+1)) return true;//已经找到一种合法情况了

		//没有找到一种合法情况，恢复现场
		a[i][j] = 0;
		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = false;
	}

	return false;
}

int main()
{
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cin >> a[i][j];
			int x = a[i][j];
			if(x)
			{
				//标记一下
				col[j][x] = row[i][x] = st[i / 3][j / 3][x] = true;
			}
		}
	}

	//一个格子一个格子填
	dfs(0, 0);

	//输出
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}


	return 0;
}

